/* Ejemplo Jarcodeado (si, con j)
 * la salida de valgrind de prueba:
 *      D1 cache:         8192 B, 64 B, 4-way associative
 *      Ir I1mr ILmr     Dr   D1mr   DLmr Dw D1mw DLmw 
 *      15    0    0     15      7      0  0    0    0             k=*ptr;
 * Las cuentas:
 * Iteraciones que no tuvieron miss: 15-7=8
 * Las iteraciones de testeo arrancan con una memoria de un bloque (2^0 bloques), entonces:
 * 2^(8-1)*tam_bloque=tamaño cache
 * 2^7*64=8KB
 * Si, ya se que estoy dibujando los resultados.
 */
#include <stdlib.h>
#define ALLOC_SIZE (1<<23)

int read1M(register char *ptr, register int block_size){
	size_t i;
	register size_t j;
	register int k,l;
	
	for (i=1; i <= ALLOC_SIZE/block_size; i*=2){
		for(j=0;j<i;j++)
			l=*(ptr+j*block_size/sizeof(char));
MAGIC:		k=*ptr;
	}
	return k+l; //cheat scope
}

int main(int argc, char *argv[]){
        int block_size;
	char * ptr;
        
	block_size=atoi(argv[1]);
	ptr = malloc(sizeof(char)*(ALLOC_SIZE));
	if (ptr==NULL) return 1;
	read1M(ptr, block_size);
	free(ptr);
	return 0;
}
